#include "database.h"
#include <QDateTime>
#include <QSqlQuery>
#include <QDebug>
#include <QSqlError>
#include <QMessageBox>
#include "command.h"

Database::Database()
{

    ////放在客户端类中初始化 避免多次初始化
//    db_init();

}


//断开数据库
void Database::CloseDatabase()
{
    if(db.open())
        db.close();
}



void Database::db_init()
{
    //数据库类型
    db=QSqlDatabase::addDatabase("QMYSQL");
    //设置数据库主机地址
    db.setHostName("localhost");
    //设置端口
    db.setPort(3306);
    //设置用户名
    db.setUserName("root");
    //设置密码
    db.setPassword("123456");
    //数据库名字
    db.setDatabaseName("xxx"); //因为此处已经设置好了数据库名，所以创建QsqlQuery对象时，不用再指定数据库名。
    if(db.open())
    {
        qDebug()<<"Database connected successfully!";
    }
    else
    {
        qDebug()<<"Database connected failed!";
    }

    // 设置编码，防止中文乱码
    db.exec("SET NAMES 'UTF-8'"); ///设置utf-8编码

}

///创建表
void Database::createtable()
{
    //query =new QSqlQuery;
    //QSqlQuery类提供了一种执行和操作SQL语句的方法。
    //next:检索结果中的下一条记录（如果可用），并将查询定位在检索到的记录上。

    //query->exec("create table user(name VARCHAR(30) PRIMARY KEY UNIQUE NOTNULL,passward VARCHAR(30))");

}

///用户登录，从数据库中查找该用户是否存在
///若存在则判断密码是否正确
///返回值：0 —— 登陆成功
///       1 —— 密码错误
///       2 —— 账号不存在
char Database::User_Login(QString cut_AccountNumber,QString Password)
{
    QString strQuery = "SELECT * FROM user_info;";
//    strQuery.append("WHERE AccountNumber='");
//    strQuery.append(cut_AccountNumber);
//    strQuery.append("';");
    qDebug() << "Input" << cut_AccountNumber << Password;
    //打印数据库信息
    QSqlQuery query(strQuery);
    while(query.next())
    {
       if(cut_AccountNumber == query.value(0))  //匹配账号
       {
           if(Password == query.value(1))       //账号存在匹配密码
           {
               qDebug() << "Result" << query.value(0) << query.value(1);
               //将信息存入数组，用于返回
               return 0;
           }
           else {
               qDebug() << "密码错误！";
               return 1;
           }
       }
    }
    return 2;//账号不存在
}

///登陆成功，获取用户消息
QVector<QString> Database::GetUserInfo(QString cut_AccountNumber)
{
    QString strQuery = "SELECT * FROM user_info;";
    QVector<QString> user_info;
    QSqlQuery query(strQuery);      //为啥不用绑定数据库名
    while(query.next())
    {
       if(cut_AccountNumber == query.value(0))  //匹配账号
       {
            //将信息存入数组，用于返回
            for(int i = 0;i < 8;i++)
            user_info.append(query.value(i).toString());
            return user_info;
       }
    }
}


///注册账号
///返回值：0——注册成功
///       1——注册失败
///       -1——账号存在
char Database::Create_Account(QString cut_AccountNumber,QString Password)
{
//    QString strQuery = "INSERT INTO user_info (AccountNumber, Password) VALUES (";
//    strQuery.append(cut_AccountNumber);
//    strQuery.append(",");
//    strQuery.append(Password);
//    strQuery.append(";");
//    QSqlQuery query(strQuery);
//    bool isOK = query.exec();
//    QSqlQuery query(db);   /     //为啥要绑定数据名？？？？

    //查找用户是否存在
    QString strQuery = "select * from user_info ";
    strQuery.append("where AccountNumber='");
    strQuery.append(cut_AccountNumber);
    strQuery.append("';");

    QSqlQuery query(strQuery);
    query.exec();

    if (query.next()) {

        return -1;
    }

    //插入用户信息到数据库
    QString insertSQL = QString("insert into user_info (AccountNumber, Password) "
                                "values('%1', '%2')").arg(cut_AccountNumber,Password);

    bool isOK = query.exec(insertSQL);

    if(isOK)
    {
        return 0;
        qDebug() << "注册成功！";
    }
    else{
        return 1;
        qDebug() << "注册失败！";
    }

    qDebug() << "注册状态" << isOK << cut_AccountNumber << Password;

}

///修改用户信息（只适用于user_info这张表）
///成功返回  True
///失败返回  False
bool Database::ModifyUserinfo(QString InfoItem,QString NewValue,QString User_Account)
{
    QString strQuery =QString("update user_info set %1='%2' where AccountNumber='%3';").arg(InfoItem,
                                  NewValue,User_Account);

    qDebug() << strQuery;

    QSqlQuery query(strQuery);
    bool isOk = query.exec();

    if(isOk)
        return true;
    else
        return false;
}


///测试数据库是否连接成功：打印User_info表的所有信息
void Database::test()
{
    QString strQuery = "SELECT * FROM shopping_car;";
    QSqlQuery query(strQuery);

    bool isOk = query.exec();

    qDebug() << "**************************数据库连接测试" << isOk << "******************************";
    while(query.next())
    {
        for(int i = 0;i < 3;i++)
        qDebug() << query.value(i);

        qDebug() << "********************************************************";
    }
}


///获取商城所有手机信息
///trurn： <QString>列表 手机信息
QVector<QString> Database::GetPhoneInfo()
{
    QVector<QString> PhoneInfo;
    QString strQuery = "SELECT * FROM phone_info;";
    QSqlQuery query(strQuery);

    qDebug() << strQuery;
    bool isOK = query.exec();
    if(isOK)
    {
        qDebug() << "Get_OK!";
        while(query.next())
        {
            for(int i = 0;i < 5;i++)
            {
                PhoneInfo.append(query.value(i).toString());
//                qDebug() << query.value(i);
            }
        }
    }
    else
    {
        qDebug() << "Get_NO!";
    }

    return PhoneInfo;
}



///获取某一手机信息，用于显示在购物车列表
QVector<QString> Database::GetPhoneInfo(QString ModelNumber)
{
    QVector<QString> PhoneInfo;
    QString strQuery = "select * from phone_info ";
    strQuery.append("where modelnumber='");
    strQuery.append(ModelNumber);
    strQuery.append("';");

    QSqlQuery query(strQuery);
    bool isOK = query.exec();

    if(isOK)
    {
//        qDebug() << "Get_OnePhoneInfo_OK!";
        while(query.next())
        {
            for(int i = 0;i < 5;i++)
            {
                PhoneInfo.append(query.value(i).toString());
//                qDebug() << query.value(i);
            }
        }
    }
    else
    {
//        qDebug() << "Get_OnePhoneInfo_NO!";
    }

    return PhoneInfo;
}

//////获取手机详细参数
QVector<QString> Database::GetPhoneDetilsInfo(QString ModelNumber)
{
    QVector<QString> PhoneDetilsInfo;
    QString strQuery = "select * from DetailParameter_info ";
    strQuery.append("where modelnumber='");
    strQuery.append(ModelNumber);
    strQuery.append("';");

//    qDebug() << strQuery;

    QSqlQuery query(strQuery);
    bool isOK = query.exec();
    if(isOK)
    {
//        qDebug() << "获取详情成功！";
    }
    else
    {
//        qDebug() << "获取详情失败！";
    }

    while(query.next())
    {
        for(int i = 0;i < 10; i++)
        {
            PhoneDetilsInfo.append(query.value(i).toString());
//            qDebug() << query.value(i);
        }
    }

    return PhoneDetilsInfo;
}


///获取购物车信息
QVector<QString> Database::GetShoppingCarInfo(QString AccountNumber)
{
    QVector<QString> ShoppingCarInfo;
    QString strQuery = "select * from shopping_car ";
    strQuery.append("where AccountNumber='");
    strQuery.append(AccountNumber);
    strQuery.append("';");
    qDebug() << strQuery;

    QSqlQuery query(strQuery);
    bool isOK = query.exec();
    if(isOK)
    {
//        qDebug() << "获取购物车成功！";
    }
    else
    {
//        qDebug() << "获取购物车失败！";
    }

    while (query.next())
    {
        for(int i = 1;i < 3;i++)
        {
            ShoppingCarInfo.append(query.value(i).toString());
//            qDebug() << query.value(i);
        }
    }

    return ShoppingCarInfo;
}

///用户加入购物车
///  0:成功
///  1：失败（先默认成功，后期修改数据库在做更改）
///  -1：已存在
char Database::UserJoinShoppingCar(QString AccountNumber,QString ModelNumber)
{
    QString strQuery = QString("select * from shopping_car where AccountNumber='%1' and "
                               "foods = '%2';").arg(AccountNumber,ModelNumber);

    QSqlQuery query(strQuery);
    while (query.next()) //说明数据库存在
    {
        return -1;
    }

    //不存在则插入数据(因为第一次插入，所以数量为 '1')
    strQuery = QString("insert into shopping_car (AccountNumber,foods,foodsNumber) "
                               "values('%1','%2','%3');").arg(AccountNumber,ModelNumber,"1");//
//    qDebug() << strQuery;

    bool isOK = query.exec(strQuery);   //主键有重复，所以会一直返回false,但插入成功

    return  0;  //先默认成功

    qDebug() << "加入成功！";

//    QSqlError error = query.lastError();//打印数据库返回的错误
//    qDebug() << "From mysql database: " + error.databaseText();

//    return isOK;
}

///从数据库中删除购物车商品
void Database::UserRemoveShoppingCar(QString AccountNumber,QString Foods)
{
    QString strQuery = QString("delete from shopping_car where AccountNumber"
                               "='%1' and foods='%2';").arg(AccountNumber,Foods);

//    qDebug() << strQuery;

    QSqlQuery query(strQuery);
    bool isOK = query.exec();

//    if(isOK)    qDebug() << "删除成功！";
//    else        qDebug() << "删除失败！";
}

//修改购物车某一商品的数量
void Database::ModifyFoodsNumber(QString AccountNumber,QString Foods,QString FoodsNumber)
{
    QString strQuery =QString("update shopping_car set foodsNumber='%1' where "
                              "AccountNumber='%2' and foods='%3';").arg(FoodsNumber,AccountNumber,Foods);

//    qDebug() << strQuery;

    QSqlQuery query(strQuery);
    bool isOk = query.exec();

//    if(isOk)
//        qDebug() << "数量修改成功！";
//    else
//        return false;
}

///添加用户订单到用户订单列表
///功能：将此商品加入到订单表单中
/// orderstate(订单状态):'待付款'、'待发货'、'待收货'、'待评论'
/// return: 0下单成功  1下单失败
char Database::AddToOrderList(QString AccountNumber,QString Foods,QString Price)
{
    QString datetime = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss");
    QString OrderforNnumber = AccountNumber + QDateTime::currentDateTime().toString("hhmmsszzz");
//    qDebug() << OrderforNnumber <<OrderforNnumber.length();


    QString strQuery = QString("insert into orderform_info (orderformnumber,AccountNumber,modelnumber,"
                               "bargaintime,actuallypaid,orderstate) values('%1','%2','%3','%4','%5','%6');"
                               ).arg(OrderforNnumber,AccountNumber,Foods,datetime,Price,"待发货");
//    qDebug() << strQuery;
    QSqlQuery query(strQuery);

    bool isOK = query.exec();

    qDebug() << "购买" << isOK;
    ///为什么返回false

    return 0;
}


////获取某用户所有订单
/// 功能：获取某用户所有订单
QVector<QString> Database::GetOrderFormList(QString AccountNumber)
{
    QVector<QString> UserOrderFormList;

    QString strQuery = QString("select * from orderform_info where AccountNumber='%1';"
                               ).arg(AccountNumber);

    QSqlQuery query(strQuery);

    while (query.next()) //说明数据库存在
    {
        for(int i = 0;i < 7;i++)
        {
            ///at(1)是账号信息
            UserOrderFormList.append(query.value(i).toString());
//            qDebug() << query.value(i);
        }
    }
    return UserOrderFormList;
}



///用户删除某一订单
/// 功能：从数据库删除某一订单
void Database::UserDeleteOrderForm(QString OrderformNumber)
{
    QString strQuery = QString("delete from orderform_info where orderformnumber"
                               "='%1';").arg(OrderformNumber);

//    qDebug() << strQuery;

    QSqlQuery query(strQuery);
    bool isOK = query.exec();

    if(isOK) qDebug() << "删除成功";
    else qDebug() << "删除失败";
}





